﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace OnlineMealOrdering.Extends
{
    /// <summary>
    /// 缓存的对象一般是集合，在单个对象被更新或者删除时为了简便，不更新缓存中对应的对象，
    /// 而是显式调用缓存初始化方法InitializeCacheObject重新获取集合并设置缓存
    /// </summary>
    public static class ApplicationCacheHelper
    {
        public static TObjectItem GetCache<TObjectItem>(string cacheKey)
        {
            TObjectItem obj = (TObjectItem)HttpContext.Current.Cache.Get(cacheKey);
            if (obj == null)
                obj = default(TObjectItem);

            return obj;
        }

        public static void InitializeCacheObject(string cacheKey,object cacheValue)
        {
            HttpContext.Current.Cache.Insert(
                        cacheKey,
                        cacheValue,
                        null,
                        System.Web.Caching.Cache.NoAbsoluteExpiration,
                        System.Web.Caching.Cache.NoSlidingExpiration
                        );
        }

        //public static object InsertCacheItem<TObjectItem>(string cacheKey, TObjectItem itemValue)
        //{
        //    try
        //    {
        //        var cacheObjects = (IList<TObjectItem>)HttpContext.Current.Cache[cacheKey];
        //        if (cacheObjects != null)
        //        {
        //            //有缓存，插入新数据
        //            cacheObjects.Add(itemValue);
        //            return itemValue;
        //        }
        //        else
        //        {
        //            return null;
        //        }
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //}

        //public static bool UpdateCacheItem<TObjectItem>(string cacheKey, TObjectItem itemValue, Func<TObjectItem, bool> predicate)
        //{
        //    try
        //    {
        //        var cacheObjects = (IList<TObjectItem>)HttpContext.Current.Cache[cacheKey];
        //        if (cacheObjects != null)
        //        {
        //            var findedItem = cacheObjects.FirstOrDefault(predicate);
        //            if (findedItem == null)
        //                return false;
        //            else
        //            {
        //                if (cacheObjects.Remove(findedItem))
        //                {
        //                    cacheObjects.Add(itemValue);
        //                    return true;
        //                }
        //                else
        //                    return false;
        //            }
        //        }
        //        else
        //        {
        //            return false;
        //        }
        //    }
        //    catch
        //    {
        //        return false;
        //    }
        //}

        //public static void DeleteCacheItem(string cacheKey, object itemValue)
        //{
        //    var cacheObjects = (IList<object>)HttpContext.Current.Cache[cacheKey];
        //    if (cacheObjects != null)
        //    {
        //        int index = cacheObjects.IndexOf(itemValue);
        //        if (index != -1)
        //        {
        //            cacheObjects.RemoveAt(index);
        //        }
        //    }
        //}
    }
}